// /* 判断字符串中的括号 ()[]{} 使用是否合法 */ 第一种有问题
export function checkBracketsIsValid(str) {
  // 采用正则匹配，获取到只有括号的字符串
  // eslint-disable-next-line no-useless-escape
  let bracketsStr = str.match(/[\(\)\[\]\{\}]/g); // ['(', '[', ']', '{', '}', ')']
  bracketsStr = bracketsStr ? bracketsStr.join('') : '';
  // 采用递归，用 replace 逐个将成对的括号剥离出原字符串
  function spliceBrackets(theStr = '') {
    const result = theStr.match(/\(\)|\[\]|\{\}/);
    console.log(result);
    // 存在成对的括号，将其 replace，进入下一次递归；不存在，判断字符串长度
    return result
      ? spliceBrackets(theStr.replace(result[0], ''))
      : theStr === '';
  }
  // 1.如果只有括号的字符串长度为偶，则进入递归，判断括号成对情况；否则，字符串中的括号不合法，返回 false；
  // 2.递归：字符串抽离到最后，如果长度为0，则字符串中的括号合法，返回 false；否则，字符串中的括号不合法，返回 false。
  return bracketsStr.length % 2 === 0 ? spliceBrackets(bracketsStr) : false;
}

/**
 * @param {string} s
 * @return {boolean}
 */
/* 判断字符串中的括号 ()[]{} 使用是否合法  括号就是： 开 闭 
  思路是：  从字符串第一个数开始判断 ， 加到一个数组（push加到最后一个），
            遇到闭的时候，判断这个闭是不是跟数组最后一个一样并且删掉数组最后一个元素，如果不一样说明这个闭是多出来的 返回false
            当循环结束，数组为空 说明都是符合的。
            
*/

export function isValid(s) {
  function spliceBrackets() {
    const stack = [];
    for (let i = 0; i < s.length; i++) {
      let c = s[i];
      switch (c) {
        case '(':
          stack.push(')');
          break;
        case '[':
          stack.push(']');
          break;
        case '{':
          stack.push('}');
          break;
        default:
          // stack.pop() 执行会删除stack最后一个元素并且返回
          if (c !== stack.pop()) {
            return false;
          }
      }
    }
    return stack.length === 0;
  }
  return s.length % 2 === 0 ? spliceBrackets() : false;
}
